#include <gtk/gtk.h>

// 打印列表中的所有项目
static void print_list_store(GListStore *store) {
    guint n = g_list_model_get_n_items(G_LIST_MODEL(store));
    g_print("\n当前列表内容 (%u 项):\n", n);
    
    for (guint i = 0; i < n; i++) {
        GtkStringObject *item = g_list_model_get_item(G_LIST_MODEL(store), i);
        const char *str = gtk_string_object_get_string(item);
        g_print("  [%d] %s\n", i, str);
        g_object_unref(item); // 释放获取的项目
    }
}

static int gtk_string_object_compare(GtkStringObject *a, GtkStringObject *b, gpointer data)
{
     const char *stra = gtk_string_object_get_string(a);
     const char *strb = gtk_string_object_get_string(b);
     return strcmp(stra, strb);
}

int main(int argc, char *argv[]) {
    gtk_init();
    
    // 创建 GListStore，指定存储 GtkStringObject 对象
    GListStore *store = g_list_store_new(GTK_TYPE_STRING_OBJECT);
    
    g_print("1. 添加字符串到列表\n");
    
    // 添加字符串
    g_list_store_append(store, G_OBJECT(gtk_string_object_new("Hello")));
    g_list_store_append(store, G_OBJECT(gtk_string_object_new("World")));
    g_list_store_append(store, G_OBJECT(gtk_string_object_new("GTK4")));
    
    print_list_store(store);
    
    g_print("\n2. 在索引1位置插入新字符串\n");
    
    // 在指定位置插入
    g_list_store_insert(store, 1, gtk_string_object_new("Inserted"));
    print_list_store(store);
    
    g_print("\n3. 修改索引2位置的字符串\n");
    
    // 修改项目
    GtkStringObject *old_item = g_list_model_get_item(G_LIST_MODEL(store), 2);
    //删除第二个(GTK4)后再新增一个
    GtkStringObject *new = gtk_string_object_new("Modified");
    g_list_store_splice(store, 2, 1, (gpointer *)&new, 1);
    g_object_unref(old_item);
    
    print_list_store(store);
    
    g_print("\n4. 查找 'GTK4'(前面已经修改) 的位置\n");
    
    // 查找项目
    GtkStringObject *search_item = gtk_string_object_new("GTK4");
    guint position;
    if (g_list_store_find(store, search_item, &position)) {
        g_print("找到 'GTK4' 在位置: %u\n", position);
    } else {
        g_print("未找到 'GTK4'\n");
    }
    g_object_unref(search_item);
    
    g_print("\n5. 排序字符串\n");
    
    // 排序列表 (按字母顺序)
    g_list_store_sort(store, (GCompareDataFunc)gtk_string_object_compare, NULL);
    print_list_store(store);
    
    g_print("\n6. 移除索引0位置的项\n");
    
    // 移除项目
    g_list_store_remove(store, 0);
    print_list_store(store);
    
    g_print("\n7. 获取最后一项\n");
    
    // 获取最后一项
    guint last_index = g_list_model_get_n_items(G_LIST_MODEL(store)) - 1;
    GtkStringObject *last_item = g_list_model_get_item(G_LIST_MODEL(store), last_index);
    g_print("最后一项: %s\n", gtk_string_object_get_string(last_item));
    g_object_unref(last_item);
    
    g_print("\n8. 清空列表\n");
    
    // 清空列表
    g_list_store_remove_all(store);
    print_list_store(store);
    
    // 清理
    g_object_unref(store);
    
    return 0;
}
